如果 Espian(竊聽者) 獲得了有關 Asja 和 Balvis 產生的密鑰的一些資訊怎麼辦?所以,現在 Asja 和 Balvis 不想直接使用這個金鑰來加密他們的秘密訊息,而是想從他們的預共享金鑰中提取隨機的𝑥
如果竊聽者 Espian 是被動的,即他只能觀察通訊但不能更改交換的訊息,那麼有一個基於使用隨機提取器(extractor)的解決方案。
基本想法是Asja可以從提取器選擇均勻的種子𝑦並將其發送給 Balvis。他們倆都會計算密鑰 𝑘=𝐸𝑥𝑡(𝑥,𝑦),k將接近於均勻隨機並且獨立於𝑦(由於提取器的屬性)。使用經過量子證明的提取器足以防止對手持有有關其密鑰的量子資訊。
Von Neumann Extractor運作在Bernoulli位元序列
Bernoulli位元序列的一個每個位元都獨立,且1和0發生的機率分別為p和1-p
如果p=0.5,這個序列會是均勻的
提取器運作如下:
1.讀取{x,y}值
2.如果讀到00或是11,重回第一步
3.如果讀到01,回傳0
4.如果讀到10,回傳1
如果是一個強大的提取器會滿足以下性質:
即使種子(seed)公開,提取的隨機性仍然接近均勻分佈。這使得可以重複使用種子並保證提取器在密碼學中使用時的安全性。
雜湊(hash)是一種單向函數 𝐻()對任意長度的訊息進行操作 𝑀並傳回一個固定長度的哈希值 ℎ
𝐻( 𝑀) = ℎ
Hash滿足以下條件
簡單實作如下:
import hashlib
message = "QWorldAssociation" # initializing string to encrypt
result = hashlib.sha256(message.encode()) # encoding using sha256
print("SHA256 is:", result.hexdigest()) # printing result in hexadecimal
哈希的另一個屬性是,給定相同的輸入,它們總是給出相同的輸出。這會是一個問題,因為如果兩個用戶具有相同的哈希值,他們將具有相同的資訊字串,並且很容易被猜到。作為解決方案,我們將隨機資料(salt)添加到雜湊函數的輸入中,以確保唯一的輸出,即使初始輸入相同。
import hashlib
def salting_hash(str, salt):
input=str+salt
result=hashlib.sha256(input.encode())
return result.hexdigest()
a = "QWorldAssociation" # initializing first string to encrypt
b = "Community" #initializing salt
c = "QWorldAssociation" # initializing first string to encrypt
d = "C0mmun1ty" #initializing salt (two different characters)
print("First string SHA256 is:", salting_hash(a,b))
print("Second string SHA256 is:", salting_hash(c,d))
K-universal hash functions使指金鑰是來自k個獨立隨機的變數的hash function
通常來說2-universal hash functions可用於建立經過量子驗證的隨機性提取器。
隨機性提取器(基於 2 個通用雜湊函數)可以描述為一個系統,它採用字串(QKD 金鑰)和鹽(生成器種子),在2 個雜湊函數之間做出決定並使用所選函數進行加密。
注意:鹽(種子)長度應等於字串(QKD 金鑰)大小。
隱私放大:
實作
我們的 2-universal 隨機性萃取器將附加鹽並使用 SHA256 和 SHA3 256 函數。
#You can use key values from previous notebook too for practice!
remain_key_asja = [0, 1, 1, 0, 0]
remain_key_balvis = [0, 1, 1, 0, 0]
from random import randrange
import hashlib
#Generating seed (salt)
seed=[]
for i in remain_key_asja:
a=randrange(2)
seed.append(a)
#Adding seeds to the keys
remain_key_asja.append(seed)
remain_key_balvis.append(seed)
#Converting lists to strings
str_key_asja = ' '.join([str(elem) for elem in remain_key_asja])
str_key_balvis = ' '.join([str(elem) for elem in remain_key_balvis])
#checking first bit to decide hash function to use
if remain_key_asja[0]==0:
result=hashlib.sha256(str_key_asja.encode())
print("Encoded using SHA256:", result.hexdigest())
else:
result=hashlib.sha3_256(str_key_asja.encode())
print("Encoded using SHA3 256:", result.hexdigest())
bin(int(result.hexdigest(), 16))[2:]
大家可以實作看看,並搭配昨天的24位元的Sifting, QBER與今天的隱私放大合在一起實作。
參考資料:womanium 教材